package com.empire.module.member.dal.mysql.warningindividual;

import java.util.*;

import com.empire.framework.common.pojo.PageResult;
import com.empire.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.empire.framework.mybatis.core.mapper.BaseMapperX;
import com.empire.module.member.dal.dataobject.warningindividual.PersonWarningCountDTO;
import com.empire.module.member.dal.dataobject.warningindividual.UnifiedWarningDTO;
import com.empire.module.member.dal.dataobject.warningindividual.WarningIndividualDO;
import com.empire.module.member.dal.dataobject.warningindividual.WarningTypeCountDTO;
import org.apache.ibatis.annotations.Mapper;
import com.empire.module.member.controller.admin.warningindividual.vo.*;
import org.apache.ibatis.annotations.Param;

/**
 * 非聚集预警记录表（1条记录对应1个人的1次预警） Mapper
 *
 * @author 主席大人
 */
@Mapper
public interface WarningIndividualMapper extends BaseMapperX<WarningIndividualDO> {

    default PageResult<WarningIndividualDO> selectPage(WarningIndividualPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<WarningIndividualDO>()
                .eqIfPresent(WarningIndividualDO::getPersonId, reqVO.getPersonId())
                .eqIfPresent(WarningIndividualDO::getWarnType, reqVO.getWarnType())
                .eqIfPresent(WarningIndividualDO::getWarningConditionId, reqVO.getConfigId())
                .inIfPresent(WarningIndividualDO::getWarningConditionId, reqVO.getConfigIdList())
                .orderByDesc(WarningIndividualDO::getId));
    }

    /**
     * 调用存储过程查询最新预警信息
     * @param pageSize 每页条数
     * @param offset 偏移量
     * @param personIds 逗号分隔的person_id字符串
     * @return 预警信息列表
     */
    List<UnifiedWarningDTO> selectLatestWarn(
            @Param("pageSize") Integer pageSize,
            @Param("offset") Integer offset,
            @Param("personIds") String personIds
    );

    /**
     * 调用存储过程查询单人最新预警信息
     * @param paramMap 包含输入参数和输出参数的Map
     * @return 预警信息列表
     */
    List<UnifiedWarningDTO> selectPersonLatestWarn(Map<String, Object> paramMap);

    /**
     * 调用存储过程查询最新预警信息（带总条数）
     * @param paramMap 包含输入参数和输出参数的Map
     * @return 预警信息列表
     */
    List<UnifiedWarningDTO> selectLatestWarn(Map<String, Object> paramMap);

    /**
     * 统计指定人员的预警数量
     * @param personIdList 人员ID列表
     * @return 统计结果
     */
    List<PersonWarningCountDTO> countPersonWarnings(@Param("personIdList") List<Integer> personIdList);

    /**
     * 不分页查询指定人员的预警信息（用于分批次合并）
     * @param personIds 逗号分隔的person_id字符串
     * @return 预警信息列表
     */
    List<UnifiedWarningDTO> selectByPersonIds(@Param("personIds") String personIds);

    /**
     * 统计今日各类型预警数量
     * @param params 包含personIds和totalPersonCount的参数映射
     * @return 预警类型统计列表
     */
    List<WarningTypeCountDTO> countTodayWarningsByType(@Param("params") Map<String, Object> params);


}